package com.bruce.springbootDemo.config;

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.text.SimpleDateFormat;

/**
 * Created by bruce on 18/11/22 -- 15:08
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LogInterceptors logInterceptors;
    @Autowired
    private UserInterceptors userInterceptors;

    /**
     * 拦截器
     *
     * @param registry 自定义一个拦截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(logInterceptors).addPathPatterns("/**");
        registry.addInterceptor(userInterceptors).addPathPatterns("/**");
    }

    /**
     * 处理跨域
     *
     * @param registry 跨域注册
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        //拦截所有的请求
        registry.addMapping("/**")
//                允许域名
                .allowedOrigins("http://www.baidu.com")
                .allowedOrigins("http://127.0.0.1")
//                允许方法
                .allowedMethods("get", "post");
    }

    /**
     * 自定义序列化
     *
     * @return
     */
    @Bean
    public ObjectMapper getObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-mm-dd  hh:mm:ss "));
        return objectMapper;
    }

    /**
     * 把默认的json转换换成fastJson
     *
     * @return HttpMessageConverters 消息转换器
     */
    @Bean
    public HttpMessageConverters fastJsonHttpMessageConverters() {
        FastJsonHttpMessageConverter converters = new FastJsonHttpMessageConverter();
        //
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(
                SerializerFeature.PrettyFormat,
                SerializerFeature.WriteMapNullValue);
        //日期格式化
        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
        //
        converters.setFastJsonConfig(fastJsonConfig);
        return new HttpMessageConverters(converters);
    }
    /**
     * QuoteFieldNames	输出key时是否使用双引号,默认为true	 
     * UseSingleQuotes	使用单引号而不是双引号,默认为false	 
     * WriteMapNullValue	是否输出值为null的字段,默认为false	 
     * WriteEnumUsingToString	Enum输出name()或者original,默认为false	 
     * UseISO8601DateFormat	Date使用ISO8601格式输出，默认为false	 
     * WriteNullListAsEmpty	List字段如果为null,输出为[],而非null	 
     * WriteNullStringAsEmpty	字符类型字段如果为null,输出为”“,而非null	 
     * WriteNullNumberAsZero	数值字段如果为null,输出为0,而非null	 
     * WriteNullBooleanAsFalse	Boolean字段如果为null,输出为false,而非null	 
     * SkipTransientField	如果是true，类中的Get方法对应的Field是transient，序列化时将会被忽略。默认为true	 
     * SortField	按字段名称排序后输出。默认为false	 
     * WriteTabAsSpecial	把\t做转义输出，默认为false	不推荐
     * PrettyFormat	结果是否格式化,默认为false	 
     * WriteClassName	序列化时写入类型信息，默认为false。反序列化是需用到	 
     * DisableCircularReferenceDetect	消除对同一对象循环引用的问题，默认为false	 
     * WriteSlashAsSpecial	对斜杠’/’进行转义	 
     * WriteDateUseDateFormat	全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);	 
     * DisableCheckSpecialChar	一个对象的字符串属性中如果有特殊字符如双引号，将会在转成json时带有反斜杠转移符。如果不需要转义，可以使用这个属性。默认为false	 
     */
}
